$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

Гранање

У овој глави приказаћемо како се могу решавати разни задаци у којима ток извршавања програма зависи од испуњености одређених услова. За такве програме кажемо да имају разгранату структуру и да се у њима врши гранање.

Елементи програмског језика

У наставку ћемо описати елементе језика Пајтон који се користе у програмима разгранате структуре.

Релацијски оператори

Често је потребно утврдити да ли су неке две вредности међусобно једнаке или за неке две вредности утврдити која је од њих већа. За поређење вредности променљивих или израза користе се релацијски оператори.

  • Основни релацијски оператор је оператор провере једнакости ==. На пример, ако желимо да испитамо да ли променљиве a и b имају исту вредност то се може постићи релацијским изразом a == b. Вредност овог израза је типа bool и најчешће се користи приликом гранања (о коме ће ускоро бити речи), али се, такође, вредност релацијског израза може и доделити променљивој. Дешава се да се приликом писања кода направи грешка и уместо оператора провере једнакости == искористи оператор доделе =. Напоменимо још и то да поређење два реална броја може произвести понашање које је другачије од очекиваног због непрецизности записа реалних вредности.

  • Поред провере једнакости, можемо вршити проверу да ли су две вредности различите. То се постиже оператором !=. Дакле, услов да променљиве a и b имају различиту вредност записује се као a != b.

  • За поређење да ли је једна вредност мања, мања или једнака, већа, већа или једнака од друге вредности користе се редом релацијски оператори <, <=, >, >=.

Очекивано, релацијски оператори су нижег приоритета у односу на аритметичке операторе, односно у изразу 2+3 == 6-1 би се најпре израчунале вредности 2+3 и 6-1 а тек онда би се проверавала једнакост ове две израчунате вредности. Такође оператори <, <=, >, >= су вишег приоритета од оператора == и !=. Сви релацијски оператори су лево асоцијативни.

Логички оператори

За запис сложених услова користимо логичке операторе. Логички оператори примењују се на операнде који су типа bool и дају резултат типа bool. Они су нижег приоритета у односу на релационе и аритметичке операторе.

  • Оператор логичке конјункције and користи се за утврђивање да ли истовремено важи неки скуп услова. На пример, вредност израза 2 < 3 && 2 > 1 је True, а вредност израза 2 < 3 && 2 < 1 је False.

  • Други основни логички оператор је оператор логичке дисјункције or. Њиме се утврђује да ли је тачан бар један од датих услова. На пример, израз 2 < 3 || 2 < 1 има вредност True, а израз 2 > 3 || 2 < 1 вредност False.

  • Оператор not даје логичку негацију. На пример, израз !(1 < 3) има вредност False, која је супротна од вредности True израза 1 < 3.

Операције логичке конјункције и дисјункције дефинисане су следећим таблицама.

and False True or False True not
False False False False False True False True
True False True True True True True False

Оператор логичке конјункције је вишег приоритета од оператора логичке дисјункције. Дакле у изразу a or b and c би се прво израчунала вредност израза b and c, а онда би се извршила операција логичке дисјункције променљиве a и вредности претходног израза. Оба бинарна логичка оператора су лево асоцијативна.

И за оператор конјункције и за оператор дисјункције карактеристично је лењо израчунавање – иако су поменути оператори бинарни, вредност другог операнда се не рачуна, уколико је вредност комплетног израза одређена вредношћу првог операнда. Дакле, приликом израчунавања вредности израза A and B, уколико је вредност израза A једнака False, не израчунава се вредност израза B; слично, приликом израчунавања вредности израза A or B, уколико је вредност израза A једнака True, не израчунава се вредност израза B.

Наредба if

Већина програмских језика, па и Пајтон, располаже наредбом гранања. Циљ гранања јесте да се на основу испуњености (или неиспуњености) неког услова одреди коју наредну наредбу треба извршити (одатле потиче и назив гранање).

Основни облик наредбе гранања у језику Пајтон је:

if uslov:
   naredba1
else:
   naredba2

У овом случају, ако је испуњен услов uslov биће извршена прва наредба, а ако услов није испуњен биће извршена друга наредба. Наравно, уместо појединачне наредбе, може се јавити и блок наредби наведен увучено. На пример, исписивање да ли је дати број паран или непаран може имати следећи облик:

if broj % 2 == 0:
   print("paran")
else:
   print("neparan)

Ставка else није обавезан део наредбе гранања. Дакле, ако бисмо хтели да испишемо да је број паран ако јесте паран, а ако није да не исписујемо ништа, то бисмо могли да постигнемо наредном наредбом:

if broj % 2 == 0:
   print("paran")

Условни израз

Уместо наредбе гранања некада је погодније искористити условни израз (израз гранања).

Условни израз има следећу форму:

rezultat_tacno if uslov else rezultat_netacno

Овај оператор је тернарни, односно има три аргумента: први је вредност израза ако је услов испуњен, други аргумент је услов од кога зависи коначна вредност израза, док се трећим аргументом задаје вредност израза ако услов није испуњен. На пример, исписивање парности задатог броја могло би да се реализује и коришћењем израза гранања:

print("paran" if broj % 2 == 0 else "neparan")

Оператор гранања је десно асоцијативан и нижег приоритета у односу на скоро све остале операторе (приоритетнији је једино од оператора доделе).